ホームに戻る
出典 :
C# の統合言語クエリ (LINQ) | Microsoft Learn はじめてのLINQ - Qiita 【C#入門】LINQの使い方総まとめ - Samurai Blog LINQチートシート的なもの - Qiita ListからDictionary作る時もLINQを使おうぜ!ILookupも便利だぜ! #C# - Qiita
関連 :
クエリ式(select、from、where) [.NET]コレクション 無名関数とラムダ式 拡張メソッド DataTable
目次 :

LINQ(Language Integrated Query)とは

C# 3.0から導入された、オブジェクト、データベース、XMLなどのデータ集合に対して、クエリ(問い合わせ)を発行できる仕組みのこと。System.Linq 名前空間に属する。 IEnumerable<T> インタフェースを実装するすべてのオブジェクト(配列、コレクションが該当。シーケンスと総称される)に対してLINQが使用できる。 LINQの機能は「クエリ演算子」によって提供され、これらは IEnumerable<T> に対する拡張メソッドとして定義されている。 メソッドの戻り値もまた IEnumerable<T> であるため、メソッドチェーンが有効である。

LINQとループの比較

// 基となるシーケンス(配列) int[] seq = {1, 2, 3, 4, 5, 6, 7, 8}; // foreach を用いた場合 int[] mod1 = new int[seq.Length]; int i = 0; foreach(int s in seq) { mod1[i] = s * 3; } // LINQ( Select() )を用いた場合 int[] mod2 = seq.Select(s => s * 3).ToArray();
上記の例では、配列 seq の各要素に 3 を乗じた配列 mod1 、mod2 を作成しているが、 LINQを用いた場合は foreach を用いる場合と比較してコードが簡潔であり、配列の初期化やインデクスも不要である。 Select() は写像を行うクエリ演算子である。Select() は引数にラムダ式をとるが、ラムダ式の引数( s )はシーケンス(ここでは seq )の各要素である。 ラムダ式の戻り値( => 演算子の右辺である s * 3 )は写像を行った結果新たに作成されるシーケンスの要素となる。 上記の例では seq 、mod1 、mod2 はいずれも同じ型であるが、写像前後で型が異なっていても構わない。

クエリ式との比較

LINQと同様、クエリ式でもクエリを実行することができる。 しかしクエリ式はSQLの知識が要求され、記述も煩雑となりがちであるが、LINQはクエリ式の弱点を補うべく開発された経緯から、比較的簡潔に記述できる。 逆にSQLに慣れているのであれば、クエリ式を用いることも選択肢となり得る。

実用例

コレクションから Dictionary を生成する

ToDictionary() メソッドを用いる。
画像
新たに作成する Dictionary のキー、および値それぞれを規定するラムダ式を記述する。
ここで、ラムダ式の引数は基となるコレクションの要素( baseDic の要素である KeyValuePair )である。
KeyValuePair は Key でキー、Value で値を参照できる。
このように、コレクションから Dictionary への転写をループを用いることなく実現できる。
尚、ToDictionary() には複数のオーバーロードが存在する。詳細は割愛。

グループボックス内のチェックされたラジオボタンを取得する

画像
上記例において、groupBox1.Controls は「groupBox1 に含まれるすべてのコントロール」、
OfType<RadioButton>() メソッドにより、「RadioButton」に該当するもののみを抽出している。
ここまでの groupBox1.Controls.OfType<RadioButton>() がLINQの対象シーケンス(集合 : グループボックス内のラジオボタン)となる。
緑線がLINQの提供する Single() メソッドで、ラムダ式を満たす唯一のオブジェクトを結果として返す。